//
//  DZYUserDefaults.swift
//  globalcarbusiness
//
//  Created by dongzhenyu on 2017/8/17.
//  Copyright © 2017年 dongzhenyu. All rights reserved.
//

import Foundation

protocol UserDefaultsNameSpace {
    
}

// RawRepresentable 需要集成 ObjectMapper 框架
extension UserDefaultsNameSpace {
    
    static func nameSpace<T>(_ key: T) -> String where T:RawRepresentable  {
        return "\(Self.self).\(key.rawValue)"
    }
}

protocol UserDefaultSetable: UserDefaultsNameSpace {
    // associatedtype 关联数据类型
    associatedtype UserDefaultKey: RawRepresentable
    
}

extension UserDefaultSetable where UserDefaultKey.RawValue == String {}

extension UserDefaultSetable {
    
    // 存储
    static func store(_ value: Any?, forkey key: UserDefaultKey) {
        UserDefaults.standard.setValue(value, forKey: nameSpace(key))
        UserDefaults.standard.synchronize()
    }
    
    // 读取
    static func storeValue(forkey key: UserDefaultKey) -> Any? {
        
        return UserDefaults.standard.object(forKey: nameSpace(key))
    }
    
    static func storeString(forkey key: UserDefaultKey) -> String? {
        return UserDefaults.standard.string(forKey: nameSpace(key))
    }
    
    // 移除
    static func removeObject(forkey key: UserDefaultKey) {
        UserDefaults.standard.removeObject(forKey: nameSpace(key))
        UserDefaults.standard.synchronize()
    }
    
}

extension UserDefaults { // 对UserDefaults的拓展
    
    struct User: UserDefaultSetable { // 定义一个结构体 User 遵守UserDefaultSetable 协议 通过下面枚举类型值去保存不同的属性
        
        enum UserDefaultKey: String {
            // 用户信息
            case userInfo // 存储的是账号和密码
            
        }
    }
    
}
